/**
 * Aibton.com Inc.
 * Copyright (c) 2004-2017 All Rights Reserved.
 */
package com.example.project.util;

import com.example.project.exception.RequestException;
import com.example.project.model.ResultObject;
import com.example.project.model.config.BaseErrorConfigEnum;
import com.example.project.model.config.IEnum;
import org.slf4j.Logger;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collector;

/**
 * 断言工具类
 * @author huzhihui
 * @version v 0.1 2017/5/9 22:10 huzhihui Exp $$
 */
public class AssertUtils {



    /**
     * 断言不为整型；如果为不为整型 || ""  "  "    抛出异常终止执行
     * @param logger    Logger
     * @param value 待检查值
     * @param enumConfig    异常返回枚举
     */
    public static void isNotInteger(Logger logger, String value, IEnum enumConfig) {
        try {
            Long.valueOf(value);
        } catch (Exception e) {
            logger.error(enumConfig.getValue());
            throw new RequestException(enumConfig);
        }
    }


    /**
     * 断言不为大于等于0的整数；如果为不为大于等于0的整数 || ""  "  "    抛出异常终止执行
     * @param logger    Logger
     * @param value 待检查值
     * @param enumConfig    异常返回枚举
     */
    public static void isNotPureDigital(Logger logger, String value, IEnum enumConfig) {
        try {
            if(Long.valueOf(value)<0){
                logger.error(enumConfig.getValue());
                throw new RequestException(enumConfig);
            }
        } catch (Exception e) {
            logger.error(enumConfig.getValue());
            throw new RequestException(enumConfig);
        }
    }


    /**
     * 断言不为空；如果为null || ""  "  "    返回false
     * @param value 待检查值
     */
    public static boolean isNotEmpty(String value) {
        if (null == value || value.trim().equals("")) {
            return false;
        }else {
            return  true;
        }
    }

    /**
     * 断言不为空；如果为null || ""  "  "    抛出异常终止执行
     * @param logger    Logger
     * @param value 待检查值
     * @param enumConfig    异常返回枚举
     */
    public static void isNotEmpty(Logger logger, String value, IEnum enumConfig) {
        if (null == value || value.trim().equals("")) {
            logger.error(enumConfig.getValue());
            throw new RequestException(enumConfig);
        }
    }

    /**
     * 断言不为空；如果为null || ""  "  "    抛出异常终止执行
     * @param logger    Logger
     * @param value 待检查值
     * @param msg   异常返回信息
     */
    public static void isNotEmpty(Logger logger, String value, String msg) {
        if (null == value || value.trim().equals("")) {
            logger.error(msg);
            throw new RequestException(msg);
        }
    }


    /**
     * 断言不为空；如果不为null 返回true
     * @param value 待检查值
     * @return
     */
    public static boolean isNotNull(Object value) {
        if (null == value) {
            return false;
        }else{
            if(value instanceof List){
                if(((List) value).size()==0){
                    return false;
                }
            }else if(value instanceof Map){
                if(((Map) value).size()==0){
                    return false;
                }
            }
            return true;
        }
    }

    /**
     * 断言不为空；如果为null 抛出异常终止执行
     * @param logger    Logger
     * @param value 待检查值
     * @param enumConfig    异常返回枚举
     */
    public static void isNotNull(Logger logger, Object value, IEnum enumConfig) {
        if (null == value) {
            logger.error(enumConfig.getValue());
            throw new RequestException(enumConfig);
        }
    }

    /**
     * 断言不为空；如果为null 抛出异常终止执行
     * @param logger    Logger
     * @param value 待检查值
     * @param msg   异常返回信息
     */
    public static void isNotNull(Logger logger, Object value, String msg) {
        if (null == value) {
            logger.error(msg);
            throw new RequestException(msg);
        }
    }

    /**
     * 断言不为空；如果为null || list.size() == 0    抛出异常终止执行
     * @param logger    Logger
     * @param list  待检查值
     * @param enumConfig    异常返回枚举
     */
    public static void isNotEmpty(Logger logger, List list, IEnum enumConfig) {
        if (null == list || list.size() == 0) {
            logger.error(enumConfig.getValue());
            throw new RequestException(enumConfig);
        }
    }

    /**
     * 断言不为空；如果为null || list.size() == 0    抛出异常终止执行
     * @param list  待检查值
     * @return  boolean    异常返回枚举
     */
    public static boolean isNotEmpty(List list) {
        if (null == list || list.size() == 0) {
            return false;
        }
        return true;
    }

    /**
     * 断言不为空；如果为null || list.size() == 0    抛出异常终止执行
     * @param logger    Logger
     * @param list  待检查值
     * @param msg   异常返回信息
     */
    public static void isNotEmpty(Logger logger, List list, String msg) {
        if (null == list || list.size() == 0) {
            logger.error(msg);
            throw new RequestException(msg);
        }
    }

    /**
     * 断言不为空；如果为null || map.size() == 0     抛出异常终止执行
     * @param logger    Logger
     * @param map   待检查值
     * @param enumConfig    异常返回枚举
     */
    public static void isNotEmpty(Logger logger, Map map, IEnum enumConfig) {
        if (null == map || map.size() == 0) {
            logger.error(enumConfig.getValue());
            throw new RequestException(enumConfig);
        }
    }

    /**
     * 断言不为空；如果为null || map.size() == 0     抛出异常终止执行
     * @param map   待检查值
     * @return boolean    异常返回枚举
     */
    public static boolean isNotEmpty(Map map) {
        if (null == map || map.size() == 0) {
            return false;
        }
        return true;
    }

    /**
     * 断言不为空；如果为null || map.size() == 0     抛出异常终止执行
     * @param logger    Logger
     * @param map   待检查值
     * @param msg   异常返回信息
     */
    public static void isNotEmpty(Logger logger, Map map, String msg) {
        if (null == map || map.size() == 0) {
            logger.error(msg);
            throw new RequestException(msg);
        }
    }

    /**
     * 断言为空；如果为不为null 抛出异常终止执行
     * @param logger    Logger
     * @param value 待检查值
     * @param enumConfig    异常返回枚举
     */
    public static void isNull(Logger logger, Object value, IEnum enumConfig) {
        if (null != value) {
            logger.error(enumConfig.getValue());
            throw new RequestException(enumConfig);
        }
    }

    /**
     * 断言请求失败；如果为不为null 抛出异常终止执行
     * @param logger    Logger
     * @param value 待检查值
     * @param enumConfig    异常返回枚举
     */
    public static void isResultObjectError(Logger logger, ResultObject value, IEnum enumConfig) {
        if (null == value || !BaseErrorConfigEnum.SUCCESS.name().equals(value.getError())) {
            logger.error(enumConfig.getValue());
            throw new RequestException(enumConfig);
        }
    }


    /**
     * 断言请求数据为空
     * @param logger    Logger
     * @param value 待检查值
     * @param enumConfig    异常返回枚举
     */
    public static void isResultObjectDataNull(Logger logger, ResultObject value, IEnum enumConfig) {
        if (null == value || !BaseErrorConfigEnum.SUCCESS.name().equals(value.getError()) ||
                value.getData()==null) {
            logger.error(enumConfig.getValue());
            throw new RequestException(enumConfig);
        }
    }


    /**
     * 断言请求数据为空
     * @param logger    Logger
     * @param value 待检查值
     * @param enumConfig    异常返回枚举
     */
    public static void isResultObjectListDataNull(Logger logger, ResultObject value, IEnum enumConfig) {
        if (null == value || !BaseErrorConfigEnum.SUCCESS.name().equals(value.getError()) ||
                value.getData()==null || ((List)value.getData()).size()==0) {
            logger.error(enumConfig.getValue());
            throw new RequestException(enumConfig);
        }
    }


    /**
     * 断言请求失败；如果为空 且执行不为SUCCESS
     * @param value 待检查值
     * @return boolean
     */
    public static boolean isResultObjectError(ResultObject value) {
        if (null == value || !BaseErrorConfigEnum.SUCCESS.name().equals(value.getError())) {
            return true;
         }else {
            return false;
        }
    }


    /**
     * 断言请求数据为空
     * @param value 待检查值
     * @return boolean
     */
    public static boolean isResultObjectDataNull(ResultObject value) {
        if (null == value || !BaseErrorConfigEnum.SUCCESS.name().equals(value.getError()) ||
                value.getData()==null) {
            return true;
        }else {
            return false;
        }
    }


    /**
     * 断言请求数据为空
     * @param value 待检查值
     * @return
     */
    public static boolean isResultObjectListDataNull(ResultObject value) {
        if (null == value || !BaseErrorConfigEnum.SUCCESS.name().equals(value.getError()) ||
                value.getData()==null || ((List)value.getData()).size()==0) {
            return true;
        }else {
            return false;
        }
    }

}
